#include <signal.h>
#include <iostream>
#include <sys/types.h>
#include <unistd.h>
using namespace std;



void Printsignal (const sigset_t &pending)
{
     for(int signo = 31; signo > 0; signo--)
    {
        if(sigismember(&pending, signo))
        {
            std::cout << "1";
        }
        else
        {
            std::cout << "0";
        }
    }
    std::cout << "\n";
}

int main()
{

    cout << "pid: " << getpid() << endl;

    sigset_t set, oset;

    // 初始化,全置空
    //  sigfillset 全置1
    sigemptyset(&set);
    sigemptyset(&oset);

    // 设置屏蔽字
    //  sigdelset 清除
    sigaddset(&set, 2); // 对于set位图，对2号信号设置屏蔽字
    sigaddset(&set, 40); 

    // 将 set 信号设置进入当前进程

    // SIG_BLOCK    添加屏蔽字
    // SIG_UNBLOCK  删除
    // SIG_SETMASK  直接用新的替换

    sigprocmask(SIG_BLOCK, &set, &oset); // oset为之前的屏蔽字

    sigset_t pending;
    sigemptyset(&pending);

    int cnt =0;
    while(1)
    {
        /* //cout<<1;
        sigpending(&pending);  //获取pending表
        Printsignal(pending);
        sleep(1);
        if(cnt ==15)
        {
            cout<<"解除对2号信号的屏蔽"<<endl;
            sigprocmask(SIG_SETMASK,&oset,nullptr);
        }
        cnt++; */
        sleep(1);
    }

}